package utils

import (
	"fmt"
	"net"
)

type CidrMask struct {
	A    int
	B    int
	C    int
	D    int
	Mask int
}

// 输入cidr类型的地址,返回IP地址和掩码,比如192.168.2.23/24返回IP地址192.168.2.0和掩码24
func GetIpAndMask(cidr string) (string, int, error) {
	_, ipNet, err := net.ParseCIDR(cidr)
	if err != nil {
		return "", 0, err
	}
	ip := ipNet.IP.String()
	mask, _ := ipNet.Mask.Size()
	return ip, mask, nil
}

// 输入A.B.C.D/M,返回CidrMask
// input: 192.168.2.23/24
// return: &{192 168 2 0 24}, nil
func ParseCidrMask(cidr string) (*CidrMask, error) {
	ip, mask, err := GetIpAndMask(cidr)
	fmt.Printf("ip: %v\n", ip)
	fmt.Printf("mask: %v\n", mask)
	if err != nil {
		return nil, err
	}
	return GetIpAndMaskIntsFromIpAndMask(ip, mask)
}

func GetIpAndMaskIntsFromIpAndMask(ip string, mask int) (*CidrMask, error) {
	var cidrVal CidrMask
	ipInt, err := IpToInt(ip)
	if err != nil {
		return nil, err
	}
	cidrVal.A = (ipInt >> 24) & 0xFF
	cidrVal.B = (ipInt >> 16) & 0xFF
	cidrVal.C = (ipInt >> 8) & 0xFF
	cidrVal.D = ipInt & 0xFF
	cidrVal.Mask = mask
	return &cidrVal, nil
}

// 输入A.B.C.D,返回整数
func IpToInt(ip string) (int, error) {
	ipAddr := net.ParseIP(ip)
	if ipAddr == nil {
		return 0, nil
	}
	ipInt := ipAddr.To4()
	if ipInt == nil {
		return 0, nil
	}
	return int(ipInt[0])<<24 + int(ipInt[1])<<16 + int(ipInt[2])<<8 + int(ipInt[3]), nil
}

// 输入掩码M,返回整数
func MaskToInt(mask string) (int, error) {
	maskAddr := net.ParseIP(mask)
	if maskAddr == nil {
		return 0, nil
	}
	maskInt := maskAddr.To4()
	if maskInt == nil {
		return 0, nil
	}
	return int(maskInt[0]), nil
}
